# -*- coding: utf-8 -*-

def square_of_sum( List ):
    tem2sum = 0;
    for v2l in List:
        tem2sum += pow( v2l,2 );

    return tem2sum;

#可变参数
def fn( *args ):
    print( args );

# 列表生成表达式
List_1 = [ x * x for x in range(1, 11) ];  #=>  [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
List_2 = [x * x for x in range(1, 11) if x % 2 == 0];  #=>  [4, 16, 36, 64, 100]
List_3 = [m + n for m in 'ABC' for n in '123' ];  # A1, A2, A3, B1, B2, B3, C1, C2, C3

fn( List_1 )
fn( List_2 )
fn( List_3 )

'''
list.append(x)	把一个元素添加到列表的结尾，相当于 a[len(a):] = [x]。
list.extend(L)	通过添加指定列表的所有元素来扩充列表，相当于 a[len(a):] = L。
list.insert(i, x)	在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引，例如 a.insert(0, x) 会插入到整个列表之前，而 a.insert(len(a), x) 相当于 a.append(x) 。
list.remove(x)	删除列表中值为 x 的第一个元素。如果没有这样的元素，就会返回一个错误。
list.pop([i])	从列表的指定位置删除元素，并将其返回。如果没有指定索引，a.pop()返回最后一个元素。元素随即从列表中被删除。（方法中 i 两边的方括号表示这个参数是可选的，而不是要求你输入一对方括号，你会经常在 Python 库参考手册中遇到这样的标记。）
list.clear()	移除列表中的所有项，等于del a[:]。
list.index(x)	返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。
list.count(x)	返回 x 在列表中出现的次数。
list.sort()	对列表中的元素进行排序。
list.reverse()	倒排列表中的元素。
list.copy()	返回列表的浅复制，等于a[:]。

insert, remove 或 sort 等修改列表的方法没有返回值。
'''

'''
把列表当堆栈使用
append() 把一个元素添加到列表的结尾
pop( x ) 默认 删除最后一个元素 & 返回
'''
stack = [ 3, 4, 5 ]
stack.append( 6 )
stack.append( 7 )

print( "\r\n列表当堆栈", stack.pop() );

'''
列表当作队列使用
也可以把列表当做队列用，只是在队列里第一加入的元素，第一个取出来；但是拿列表用作这样的目的效率不高。
在列表的最后添加或者弹出元素速度快，然而在列表里插入或者从头部弹出速度却不快（因为所有其他的元素都得一个一个地移动）。

效率不高,但可以转化为双向队列使用
'''

from collections import deque;

queue = deque([ "Eric", "John", "Michael" ]);
queue.append( "Terry" );
queue.append( "Graham" );

queue.popleft() # 'Eric'

'''
queue.Queue ：先进先出队列
queue.LifoQueue ：后进先出队列
queue.PriorityQueue ：优先级队列
queue.deque ：双向队列
'''

import queue

'''
qsize() 获取当前队列中元素的个数，也就是队列的大小
empty() 判断当前队列是否为空，返回True或者False
full() 判断当前队列是否已满，返回True或者False
put(self, block=True, timeout=None)

往队列里放一个元素，默认是阻塞和无时间限制的。如果，block设置为False，则不阻塞，这时，如果队列是满的，放不进去，就会弹出异常。如果timeout设置为n秒，则会等待这个秒数后才put，如果put不进去则弹出异常。

get(self, block=True, timeout=None)
从队列里获取一个元素。参数和put是一样的意思。
join() 阻塞进程，直到所有任务完成，需要配合另一个方法task_done。

task_done() 表示某个任务完成。每一条get语句后需要一条task_done。
'''
# 先进先出队列 Queue( maxsize )
q = queue.Queue()
q.put(123)
q.put(456)

print(q.get())      # 123
q.task_done()

print(q.get())      # 456
q.task_done()
q.join()

# join,task_done，阻塞进程，当队列中任务执行完毕之后，不再阻塞

'''
# 先进后出队列  
类似于“堆栈”，后进先出。也较常用。
'''
q = queue.LifoQueue()
q.put(123)
q.put(456)
print(q.get())          # 456
print(q.get())          # 123

'''
# 优先级队列  带有权重的队列，
每个元素都是一个元组，前面的数字表示它的优先级，数字越小优先级越高，
同样的优先级先进先出

'''
q = queue.PriorityQueue()
q.put((1, 'rain1'))
q.put((3, 'rain3'))
q.put((7, 'rain7'))
q.put((2, 'rain2'))
print(q.get())
print(q.get_nowait())

#-------------------------------------
    # (1, 'rain1')
    # (2, 'rain2')
'''
# 双向队列
Queue和LifoQueue的“综合体”，双向进出。
'''


q = queue.deque()
q.append(123)
q.append(456)
q.appendleft(789)
print(q.pop())
print(q.popleft())

#--------------------
    # 456
    # 789